package Ptr

//描述不可寻址的一些
func Test() {
	const num = 123
	var num1 = 123
	var num2 = 4
	//_ = &num 常量不可寻址
	//_ = &(123) // 基本类型值的字面量不可寻址。
	_, _ = &num1, &num2 //变量可以寻址

	var str = "abc"
	_ = str
	//_ = &(str[0]) // 对字符串变量的索引结果值不可寻址。
	//_ = &(str[0:2]) // 对字符串变量的切片结果值不可寻址。
	str2 := str[0]
	_ = &str2 // 但这样的寻址就是合法的。

	//_ = &(num1+num2)	//算术操作结果不可寻址

	//_ = &([3]int{1, 2, 3}[0]) // 对数组字面量的索引结果值不可寻址。
	//_ = &([3]int{1, 2, 3}[0:2]) // 对数组字面量的切片结果值不可寻址。
	_ = &([]int{1, 2, 3}[0]) // 对切片字面量的索引结果值却是可寻址的。
	//_ = &([]int{1, 2, 3}[0:2]) // 对切片字面量的切片结果值不可寻址。
	//_ = &(map[int]string{1: "a"}[0]) // 对字典字面量的索引结果值不可寻址。

	var map1 = map[int]string{1: "a", 2: "b", 3: "c"}
	_ = map1
	//_ = &(map1[2]) // 对字典变量的索引结果值不可寻址。

	f := func(x, y int) int {
		return x + y
	}
	_ = &f //承载函数的变量可以寻址
	//_ = &f(1,3)  //函数计算返回的临时变量不能寻址
	//_ = &(func(x, y int) int {
	//	return x + y
	//}) // 字面量代表的函数不可寻址。

	var chan1 = make(chan int, 1)
	chan1 <- 1
	_ = &chan1 //通道可以寻址
	//_ = &(<-chan1) // 接收表达式的结果值不可寻址。

	//New("test").SetName("xxx")   //New("test")不能寻址，导致不能调用SetName
	New1("test").SetName("xxx") //New1 返回指针类型，可以直接使用。
}

type Dog struct {
	name string
}

func (dog *Dog) SetName(name string) {
	dog.name = name
}

func (dog Dog) Name() string {
	return dog.name
}

func New(name string) Dog {
	return Dog{name: name}
}

func New1(name string) *Dog {
	return &Dog{name: name}
}
